#include <cassert>
#include <unistd.h>
#include "./data/FMOD/api/inc/fmod.h"

#include "menuSDL.h"
#include <stdio.h>
#include <stdlib.h>

void menuInit(sdlmenu & men)
{
    men.ecran=NULL;
    men.fond=NULL;
    men.titre=NULL;
    men.instruction1=NULL;
    men.instruction2=NULL;
    men.instruction3=NULL;
    men.instruction4=NULL;
    men.police=NULL;
    men.police1=NULL;
    men.police2=NULL;
    men.police3=NULL;
    men.police4=NULL;
}

void instruction(sdlmenu & men)
{
    int continuer=1;
    SDL_Event fermeture;
    SDL_Surface *titre=NULL,*texte=NULL;
    SDL_Surface *textinstr1=NULL,*textinstr2=NULL, *textinstr3=NULL, *textinstr4=NULL;
    SDL_Rect positiontitre, positiontexte1, positiontexte2;
    SDL_Rect positiontextinstr1, positiontextinstr2, positiontextinstr3, positiontextinstr4;

//position des textes
    positiontitre.x=260;
    positiontitre.y=10;
    positiontexte1.x=10;
    positiontexte1.y=15;
    positiontexte2.x=10;
    positiontexte2.y=210;
    positiontextinstr1.x=70;
    positiontextinstr1.y=160;
    positiontextinstr2.x=70;
    positiontextinstr2.y=200;
    positiontextinstr3.x=400;
    positiontextinstr3.y=160;
    positiontextinstr4.x=400;
    positiontextinstr4.y=200;

    SDL_Color couleurRouge = {255, 0, 0}; // couleur d'ecriture

// recupere les images pour les instructions
    men.instruction1 = SDL_load_image("data/fg.bmp");
    SDL_SetColorKey(men.instruction1,SDL_SRCCOLORKEY,SDL_MapRGB(men.ecran->format,0,255,0));
	if (!men.instruction1) men.instruction1 = SDL_load_image("../data/fg.bmp");
	assert( men.instruction1);

    men.instruction2 = SDL_load_image("data/fd.bmp");
    SDL_SetColorKey(men.instruction2,SDL_SRCCOLORKEY,SDL_MapRGB(men.ecran->format,0,255,0));
	if (!men.instruction2) men.instruction2 = SDL_load_image("../data/fd.bmp");
	assert( men.instruction2);

    men.instruction3 = SDL_load_image("data/fb.bmp");
    SDL_SetColorKey(men.instruction3,SDL_SRCCOLORKEY,SDL_MapRGB(men.ecran->format,0,255,0));
	if (!men.instruction3) men.instruction3 = SDL_load_image("../data/fb.bmp");
	assert( men.instruction3);

    men.instruction4 = SDL_load_image("data/fh.bmp");
    SDL_SetColorKey(men.instruction4,SDL_SRCCOLORKEY,SDL_MapRGB(men.ecran->format,0,255,0));
	if (!men.instruction4) men.instruction4 = SDL_load_image("../data/fh.bmp");
	assert( men.instruction4);

    titre = TTF_RenderText_Blended(men.police3, "Instructions du jeu", couleurRouge);
    textinstr1 = TTF_RenderText_Blended(men.police4, "Les canards vont a gauche", couleurRouge);
    textinstr2 = TTF_RenderText_Blended(men.police4, "Les canards vont a droite", couleurRouge);
    textinstr3 = TTF_RenderText_Blended(men.police4, "Les canards se deplacent plus rapidement", couleurRouge);
    textinstr4 = TTF_RenderText_Blended(men.police4, "Les canards tournent sur eux memes", couleurRouge);


    while(continuer)
    {
       SDL_FillRect( men.ecran, &men.ecran->clip_rect, SDL_MapRGB( men.ecran->format, 230, 230, 230 ) );

    //titre
        SDL_BlitSurface(titre, NULL, men.ecran, &positiontitre);

    //image + legendes
        SDL_apply_surface( men.instruction1, men.ecran,20,150);
        SDL_apply_surface( men.instruction2, men.ecran,20,190);
        SDL_apply_surface( men.instruction3, men.ecran,350,150);
        SDL_apply_surface( men.instruction4, men.ecran,350,190);

        SDL_BlitSurface(textinstr1, NULL, men.ecran, &positiontextinstr1);
        SDL_BlitSurface(textinstr2, NULL, men.ecran, &positiontextinstr2);
        SDL_BlitSurface(textinstr3, NULL, men.ecran, &positiontextinstr3);
        SDL_BlitSurface(textinstr4, NULL, men.ecran, &positiontextinstr4);

    //instructions
        FILE* f_regles1 = NULL;
        char regles1[200];
        f_regles1 = fopen("regles1", "r");

        if (f_regles1 != NULL)
        {
            do
            {
                positiontexte1.y+=15;
                fgets(regles1, 200, f_regles1);
                regles1[strlen(regles1)-1] = '\0';
                texte = TTF_RenderText_Blended(men.police4, regles1, couleurRouge);
                SDL_BlitSurface(texte, NULL, men.ecran, &positiontexte1);
            }
            while(fgets(regles1, 200, f_regles1) != NULL);  // on continue tant qu'on n'est pas à la fin du fichier
            fclose(f_regles1);
        }

        FILE* f_regles2 = NULL;
        char regles2[500];
        f_regles2 = fopen("regles2", "r");

        if (f_regles2 != NULL)
        {
            do
            {
                positiontexte2.y+=15;
                fgets(regles2, 500, f_regles2);
                regles2[strlen(regles2)-1] = '\0';
                texte = TTF_RenderText_Blended(men.police4, regles2, couleurRouge);
                SDL_BlitSurface(texte, NULL, men.ecran, &positiontexte2);
            }
            while(fgets(regles2, 500, f_regles2) != NULL);  // on continue tant qu'on n'est pas à la fin du fichier
            fclose(f_regles2);
        }

        SDL_Flip(men.ecran);
        while(SDL_WaitEvent(&fermeture) && continuer !=0) /* On attend un évènement qu'on récupère dans event */
        {
            switch(fermeture.type) /* On teste le type d'évènement */
            {
                case SDL_QUIT: // Si c'est un évènement QUITTER
                    continuer = 0; // On met le booléen à 0, donc la boucle va s'arrêter
                    break;
                case SDL_KEYDOWN: /* Si appui d'une touche */
                    switch (fermeture.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                            continuer = 0;
                            break;
                        default : break;
                    }
                default :
                    break;
            }
        }
    }
    SDL_FreeSurface(titre);
    SDL_FreeSurface(texte);
    SDL_FreeSurface(textinstr1);
    SDL_FreeSurface(textinstr2);
    SDL_FreeSurface(textinstr3);
    SDL_FreeSurface(textinstr4);
}


int chargementNiveau(sdlmenu& men)
{
    int continuer = 1;
    char laChaine0[] ="0: Map 0";
    char laChaine1[] ="1: Map 1";
    char laChaine2[] ="2: Map 2";
    char laChaine3[] ="3: Map 3";
    char laChaine4[] ="4: Map 4";
    char laChaine5[] ="retour au menu : appuyer sur Echap";
    char niv[250];
    SDL_Color couleurRouge = {255, 0, 0};
   // SDL_Color couleurNoire = {0, 0, 0};
    SDL_Surface *titre = NULL;
    SDL_Surface *texte0 = NULL,  *texte1 = NULL, *texte2 = NULL, *texte3 = NULL, *texte4=NULL, *texte5=NULL;
    SDL_Rect positiontitre, positiontexte0, positiontexte1, positiontexte2, positiontexte3, positiontexte4, positiontexte5;
    SDL_Event fermeture;

//titre
    positiontitre.x = 80;
    positiontitre.y = 30;
    titre = TTF_RenderText_Blended(men.police, "Chargement de la Map", couleurRouge);

//position des textes
    positiontexte0.x = 100;
    positiontexte0.y = 150;
    /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal)*/
    texte0 = TTF_RenderText_Blended(men.police1, laChaine0, couleurRouge);

    positiontexte1.x = 100;
    positiontexte1.y = 300;
    /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal)*/
    texte1 = TTF_RenderText_Blended(men.police1, laChaine1, couleurRouge);

    positiontexte2.x = 500;
    positiontexte2.y = 150;
    texte2 = TTF_RenderText_Blended(men.police1, laChaine2, couleurRouge);

    positiontexte3.x = 500;
    positiontexte3.y = 300;
    texte3 = TTF_RenderText_Blended(men.police1, laChaine3, couleurRouge);

    positiontexte4.x = 298;
    positiontexte4.y = 390;
    texte4 = TTF_RenderText_Blended(men.police1, laChaine4, couleurRouge);

    positiontexte5.x=420;
    positiontexte5.y=430;
    texte5 = TTF_RenderText_Blended(men.police3, laChaine5, couleurRouge);

    while(continuer != 0)
    {
        //ecran
        SDL_apply_surface( men.fond, men.ecran,0, 0);

   //affichage des textes
        SDL_BlitSurface(titre, NULL, men.ecran, &positiontitre);
        SDL_BlitSurface(texte0, NULL, men.ecran, &positiontexte0);
        SDL_BlitSurface(texte1, NULL, men.ecran, &positiontexte1);
        SDL_BlitSurface(texte2, NULL, men.ecran, &positiontexte2);
        SDL_BlitSurface(texte3, NULL, men.ecran, &positiontexte3);
        SDL_BlitSurface(texte4, NULL, men.ecran, &positiontexte4);
        SDL_BlitSurface(texte5, NULL, men.ecran, &positiontexte5);
        SDL_Flip(men.ecran); //mis a jour de l'ecran
        while(SDL_PollEvent(&fermeture) && continuer != 0) // On attend un évènement qu'on récupère dans event
        {
            switch(fermeture.type) // On teste le type d'évènement
            {
                case SDL_QUIT: /* Si c'est un évènement QUITTER */
                    continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                    break;
                case SDL_KEYDOWN: // Si appui d'une touche
                    switch (fermeture.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                            strcpy(niv,"data/level/Niv0");
                            continuer = 0;
                            break;
                        case SDLK_KP0: // chargement de la map Niv0
                            strcpy(niv,"data/level/Niv0");
                            break;
                        case SDLK_KP1:// chargement de la map Niv1
                            strcpy(niv,"data/level/Niv1");
                            break;
                        case SDLK_KP2:
                            strcpy(niv,"data/level/Niv2");
                            break;
                        case SDLK_KP3:
                            strcpy(niv,"data/level/Niv3");
                            break;
                        case SDLK_KP4:
                            strcpy(niv,"data/level/Niv4");
                            break;
                        default : 
				strcpy(niv,"data/level/Niv0");
                            	continuer = 0;
				break;
                    }
                    if(continuer == 1) // si on veut charger une map : on commence le jeu
                    {
                        sdlJeu sj;
                        sdljeuInit(sj, niv);
                        sdljeuBoucle( sj );
                        sdljeuDetruit( sj );
                        men.ecran = SDL_SetVideoMode( 750, 450, 32, SDL_HWSURFACE);
                        continuer = 0;
                    }
            }
        }
    }
    SDL_FreeSurface(titre);
    SDL_FreeSurface(texte0);
    SDL_FreeSurface(texte1);
    SDL_FreeSurface(texte2);
    SDL_FreeSurface(texte3);
    SDL_FreeSurface(texte4);
    SDL_FreeSurface(texte5);

    return 0;
}


void menu(sdlmenu & men)
{
    bool init; // pour le son
    char niv[250]; // pour le fichier du niveau
    int continuer = 1; // pour arreter la boucle
    char laChaine1[] = "n : Nouvelle Partie";
    char laChaine2[] = "l : Choix de la map";
    char laChaine3[] = "i : Instructions";
    char laChaine4[] = "jeu realise par Beryl, Boris et Claire";
    SDL_Color couleurRouge = {255, 0, 0};
   // SDL_Color couleurNoire = {0, 0, 0};
    SDL_Surface *texte1=NULL, *texte2=NULL, *texte3=NULL, *texte4=NULL;
    SDL_Rect positiontitre, positiontexte1, positiontexte2, positiontexte3, positiontexte4;
    SDL_Event fermeture;


//initialisation du son
    init = FSOUND_Init(44100,32,0);
    assert(init == true);

//initialisation de la TTF
    if(TTF_Init() == -1)
    {
        fprintf(stderr, "Erreur d'initialisation de TTF_Init : %s\n", TTF_GetError());
        exit(EXIT_FAILURE);
    }

    men.ecran = SDL_SetVideoMode(750,450,32,SDL_HWSURFACE);
    SDL_WM_SetCaption("Menu",NULL);//Renomage de la fenètre d'éxécution

    men.fond = SDL_load_image("data/mare/mare2.bmp");
    if (!men.fond) men.fond = SDL_load_image("../data/mare/mare2.bmp");
    assert(men.fond);

    men.police = TTF_OpenFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", 50);  // ouvre la police
    assert(men.police != NULL);
    men.police1 = TTF_OpenFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", 25);  // ouvre la police
    assert(men.police1 != NULL);
    men.police2 = TTF_OpenFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", 15);  // ouvre la police
    assert(men.police2 != NULL);
    men.police3 = TTF_OpenFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", 18);  // ouvre la police
    assert(men.police3 != NULL);
    men.police4 = TTF_OpenFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf", 12);  // ouvre la police
    assert(men.police4 != NULL);

    //titre
    positiontitre.x = 280;
    positiontitre.y = 50;
    men.titre = TTF_RenderText_Blended(men.police, "TETRIS", couleurRouge);

    positiontexte1.x = 20;
    positiontexte1.y = 150;
    texte1 = TTF_RenderText_Blended(men.police1, laChaine1, couleurRouge);

    positiontexte2.x = 20;
    positiontexte2.y = 300;
    texte2 = TTF_RenderText_Blended(men.police1, laChaine2, couleurRouge);

    positiontexte3.x = 550;
    positiontexte3.y = 240;
    texte3 = TTF_RenderText_Blended(men.police1, laChaine3, couleurRouge);

    positiontexte4.x = 480;
    positiontexte4.y = 430;
    texte4 = TTF_RenderText_Blended(men.police2, laChaine4, couleurRouge);

    while (continuer != 0) // TANT QUE la variable ne vaut pas 0

    {
    //pour le fond de l'ecran
        SDL_apply_surface( men.fond, men.ecran,0, 0);

        SDL_BlitSurface(men.titre, NULL, men.ecran, &positiontitre);
        SDL_BlitSurface(texte1, NULL, men.ecran, &positiontexte1);
        SDL_BlitSurface(texte2, NULL, men.ecran, &positiontexte2);
        SDL_BlitSurface(texte3, NULL, men.ecran, &positiontexte3);
        SDL_BlitSurface(texte4, NULL, men.ecran, &positiontexte4);


        SDL_Flip(men.ecran); // Mise à jour de l'écran avec les textes
        while(SDL_PollEvent(&fermeture) && continuer != 0) // On attend un évènement qu'on récupère dans event
        {
            switch(fermeture.type) // On teste le type d'évènement
            {
                case SDL_QUIT: // Si c'est un évènement QUITTER
                    continuer = 0; // On met le booléen à 0, donc la boucle va s'arrêter
                    break;
                case SDL_KEYDOWN: // Si appui d'une touche
                    switch (fermeture.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Appui sur la touche Echap, on arrête le programme
                            continuer = 0;
                            break;
                        case SDLK_n: //nouvelle partie
                            sdlJeu sj;
                            strcpy(niv,"data/level/Niv0");
                            sdljeuInit( sj,niv );
                            sdljeuBoucle( sj );
                            sdljeuDetruit( sj );
                            men.ecran = SDL_SetVideoMode(750,450,32,SDL_HWSURFACE);
                            break;
                        case SDLK_l: // charger une partie d'apres le niveau
                            chargementNiveau(men);
                            break;
                        case SDLK_i: // les instructions du jeu
                            instruction(men);
                            break;
                        default : break;
                    }
                    break;
                default : break;
            }
        }
    }

    SDL_FreeSurface(texte1);
    SDL_FreeSurface(texte2);
    SDL_FreeSurface(texte3);
    SDL_FreeSurface(texte4);
}


void menuDetruit( sdlmenu& men)
{
	//avant de detruire, on verifie que ca a bien ete initialisé
    if (men.police != NULL)
        TTF_CloseFont(men.police);
    if (men.police1 != NULL)
        TTF_CloseFont(men.police1);
    if (men.police2 != NULL)
        TTF_CloseFont(men.police2);
    if (men.police3 != NULL)
        TTF_CloseFont(men.police3);
    if (men.police4 != NULL)
        TTF_CloseFont(men.police4);
    TTF_Quit();

    if (men.titre != NULL)
        SDL_FreeSurface(men.titre);
    if (men.fond != NULL)
        SDL_FreeSurface(men.fond);
    if (men.ecran != NULL)
        SDL_FreeSurface(men.ecran );
    if (men.instruction1 != NULL)
        SDL_FreeSurface(men.instruction1 );
    if (men.instruction2 != NULL)
        SDL_FreeSurface(men.instruction2 );
	if (men.instruction3 != NULL)
        SDL_FreeSurface(men.instruction3 );
	if (men.instruction4 != NULL)
        SDL_FreeSurface(men.instruction4 );
    SDL_Quit();
}





